const express = require("express");
//导入 formidable
const formidable = require("formidable");
//创建路由器对象
const router = express.Router();
//导入用户的模型文件
const UserModel = require("../db/models/UserModel");
//导入 md5 函数
const md5 = require("md5");
//导入错误编号
const {
  PASSWORD_NOT_SAME,
  USERNAME_FORMAT_ERROR,
  USERNAME_EXISTS,
  LACK_OF_ID,
  USER_NOT_FOUND,
  FORM_PARSE_ERROR,
  SUCCESS_CODE
} = require("../config").error;

//新增用户的路由
router.post("/user", (req, res) => {
  //获取浏览器发送过来的数据 body-parser 这里不合适, 这里选择 formidable
  //创建 form 对象
  const form = formidable({
    multiples: true,
    //设置文件上传的文件夹
    uploadDir: __dirname + "/../public/uploads",
    //设置保留文件的后缀名
    keepExtensions: true,
  });
  // err 是错误对象  fields 是一般字段的数据   files 是文件上传的数据
  form.parse(req, async (err, fields, files) => {
    try {
      if (err) {
        res.json({
          msg: "表单解析错误",
          data: null,
          code: FORM_PARSE_ERROR,
        });
        return;
      }
      //一. 检测数据
      let { pwd, repwd, username } = fields;
      //1. 判断两次密码是否一致
      if (pwd !== repwd) {
        //响应失败的结果
        return res.json({
          msg: "两次密码不一致",
          data: null,
          code: "1001",
        });
      }
      //2. 检测账号的格式 6 - 18 位非空白字符
      let reg = /^\S{5,18}$/;
      if (!reg.test(username)) {
        return res.json({
          msg: "用户名格式错误, 要求 6 - 18 位非空白字符",
          data: null,
          code: "1002",
        });
      }
      //其他  用户名敏感词, 长度处理
      //3. 检测用户名是否已经存在
      let count = await UserModel.count({ username: username }); //用于统计满足条件的数量
      //判断
      if (count > 0) {
        return res.json({
          msg: "用户名已经存在",
          data: null,
          code: "1003",
        });
      }
      //二. 整理数据, 插入数据库
      //获取文件上传后的路径
      let filePath = files.profile.filepath.replaceAll("\\", "/");
      //获取截取的起始下标
      let start = filePath.indexOf("/uploads");
      //获取图片的访问路径  slice(start, end)
      let url = filePath.slice(start);
      // 创建一个对象, 并设置对应的属性
      let data = {
        username: username,
        pwd: md5(pwd),
        // D:\\www\\BJ_220707\\6-webpack-project\\代码\\server\\public\\uploads\\0b3df33f119c83795c3ec0400.png
        profile: url,
      };
      //插入数据库中
      let result = await UserModel.create(data);
      //如果插入成功
      res.json({
        msg: "添加成功",
        data: result,
        code: SUCCESS_CODE,
      });
    } catch (e) {
      console.log(e);
      res.json({
        msg: "服务异常",
        data: null,
        code: "5000",
      });
    }
  });
});

//获取用户的路由   /admin/user?page=1&limit=10
router.get("/user", async (req, res) => {
  try {
    //获取 url 中的 query 参数
    let page = req.query.page || 1;
    let limit = req.query.limit || 10;
    //计算 skip 的值
    let skip = (page - 1) * limit;
    //查询数据库获取用户集合的总数
    let count = await UserModel.count();
    //查询数据库
    let users = await UserModel.find().skip(skip).limit(limit);
    res.json({
      data: {
        users: users,
        count: count,
      },
      msg: "获取成功",
      code: "2000",
    });
  } catch (e) {
    res.json({
      msg: "服务异常",
      code: "5000",
      data: null,
    });
  }
});

//获取单个的用户信息   /user/123456
router.get("/user/:id", async (req, res) => {
  try {
    //根据请求的 ID 获取用户的信息, 并响应给客户端
    let id = req.params.id;
    //判断
    if (!id) {
      return res.json({
        msg: "缺失 ID 参数",
        data: null,
        code: "1004",
      });
    }
    //根据 ID 查询数据库
    let user = await UserModel.findOne({ _id: id });
    //如果没有查询到
    if (!user) {
      return res.json({
        msg: "获取失败",
        data: null,
        code: "1005",
      });
    }
    //响应
    return res.json({
      msg: "获取成功",
      data: user,
      code: "2000",
    });
  } catch (e) {
    res.json({
      msg: "服务异常",
      code: "5000",
      data: null,
    });
  }
});

//删除某个用户
router.delete("/user/:id", async (req, res) => {
  try {
    //获取请求的 id 参数
    let id = req.params.id;
    //查询数据库
    await UserModel.deleteOne({ _id: id });
    //响应
    res.json({
      msg: "删除成功",
      data: null,
      code: "2000",
    });
  } catch (e) {
    res.json({
      msg: "服务异常",
      code: "5000",
      data: null,
    });
  }
});

//用户的更新
router.put("/user/:id", (req, res) => {
  //获取 url 中的 id 参数
  let id = req.params.id;
  //创建 form 对象
  const form = formidable({
    multiples: true,
    //设置文件上传的文件夹
    uploadDir: __dirname + "/../public/uploads",
    //设置保留文件的后缀名
    keepExtensions: true,
  });
  //解析报文数据
  form.parse(req, async (err, fields, files) => {
    if (err) {
      res.json({
        msg: "表单解析异常",
        data: null,
        code: "1006",
      });
      return;
    }
    try {
      //获取用户名的数据
      let { username } = fields;
      let data = {
        username: username,
      };
      //如果存在文件上传
      if (files.profile) {
        //处理表单数据
        //获取文件上传后的路径
        let filePath = files.profile.filepath.replaceAll("\\", "/");
        //获取截取的起始下标
        let start = filePath.indexOf("/uploads");
        //获取图片的访问路径  slice(start, end)
        let url = filePath.slice(start);
        //设置对象中的 profile 属性
        data.profile = url;
      }
      console.log(data);
      //更新数据库
      await UserModel.updateOne({ _id: id }, data);
      //
      res.json({
        msg: "更新成功",
        data: null,
        code: "2000",
      });
    } catch (e) {
      console.log(e);
      res.json({
        msg: "服务异常",
        code: "5000",
        data: null,
      });
    }
  });
});

//暴露对象
module.exports = router;
